from urllib import request  # 爬去豆瓣网电影排名信息
from lxml import etree  # /html/body/div[3]/div[1]/div/div[1]/        ol/li[2]/div/div[1]/a/img              #图片
import os  # /html/body/div[3]/div[1]/div/div[1]/        ol/li[2]/ div/div[2]/div[1]/a/span[1]   #名字


# /html/body/div[3]/div[1]/div/div[1]/        ol/li[2]/ div/div[2]/div[2]/p[1]      #导演  与 主演
# /html/body/div[3]/div[1]/div/div[1]/        ol/li[2] /div/div[2]/div[2]/p[2]/span  #时间  与 地点
# 构造函数，抓取第i页信息
def crow(i):
    #  构造第i页的网址
    url = 'https://movie.douban.com/top250?start=' + str(25 * i)
    #  发送请求，获得返回的html代码并保存在变量html中
    html = request.urlopen(url).read().decode('utf-8')

    # 将返回的字符串格式的html代码转换成xpath能处理的对象
    html = etree.HTML(html)

    # 先定位到li标签，datas是一个包含25个li标签的list，就是包含25部电影信息的list
    datas = html.xpath('//ol[@class="grid_view"]/li')  # *****
    a = 0
    for data in datas:
        data_title = data.xpath('div/div[2]/div[@class="hd"]/a/span[1]/text()')  # *****注意若是标签内部的文本加上text（）
        data_info = data.xpath('div/div[2]/div[@class="bd"]/p[1]/text()')
        data_quote = data.xpath('div/div[2]/div[@class="bd"]/p[2]/span/text()')
        data_score = data.xpath('div/div[2]/div[@class="bd"]/div/span[@class="rating_num"]/text()')
        data_num = data.xpath('div/div[2]/div[@class="bd"]/div/span[4]/text()')
        data_picurl = data.xpath('div/div[1]/a/img/@src')

        print("No: " + str(i * 25 + a + 1))  # 此处用于打印简略的电影榜单
        print(data_title)
        path = 'H:\\新建文件夹\\电影'
        if not os.path.exists(path):
            os.makedirs(path)
            # 保存电影信息到txt文件，下载封面图片
        with open('H:\\新建文件夹\\电影\\豆瓣top榜.txt', 'a', encoding='utf-8')as f:

            # 封面图片保存路径和文件名
            picname = path + '\\' + 'No_' + str(i * 25 + a + 1) + data_title[0] + '.jpg'

            f.write("No: " + str(i * 25 + a + 1) + '\n')  # 排名
            f.write(data_title[0] + '\n')  # 电影名
            f.write(str(data_info[0]).strip() + '\n')  # 导演  与 主演
            f.write(str(data_info[1]).strip() + '\n')  # 时间  与 地点
            if data_quote:  # 因为发现有几部电影没有quote，所以这里加个判断，以免报错
                f.write(data_quote[0] + '\n')  # 名句
            f.write(data_score[0] + '\n')  # 评分
            f.write(data_num[0] + '\n')  # 评价人数
            f.write('\n' * 3)
            try:
                # 下载封面图片到本地，路径为picname（这里包含有图片文件的命名）
                request.urlretrieve(data_picurl[0], filename=picname)
            except:
                print('error')
        a += 1


for i in range(2):  # 爬取的页数
    crow(i)